#include <string.h>
#include "json_func.h"
#include "usr_cfg.h"

/*
 * Copy src to string dst of size siz.  At most siz-1 characters
 * will be copied.  Always NUL terminates (unless siz == 0).
 * Returns strlen(src); if retval >= siz, truncation occurred.
 */
size_t
strlcpy(char *dst, const char *src, size_t siz)
{
    register char *d = dst;
    register const char *s = src;
    register size_t n = siz;
 
    if (s == 0 || d == 0) return 0;
 
    /* Copy as many bytes as will fit */
    if (n != 0 && --n != 0) {
        do {
            if ((*d++ = *s++) == 0)
                break;
        } while (--n != 0);
    }
 
    /* Not enough room in dst, add NUL and traverse rest of src */
    if (n == 0) {
        if (siz != 0)
            *d = '\0';      /* NUL-terminate dst */
        while (*s++)
            ;
    }
 
    return(s - src - 1);    /* count does not include NUL */
}

int strlcpy_by_jso_key(const json_object *src_jso, const char *key, char *str_dst, size_t size)
{
    const char *str_tmp;

    json_object *kjso = json_object_object_get(src_jso, key);
    if ((kjso == NULL) || (!json_object_is_type(kjso, json_type_string)))
    {
        return FAILURE;
    }

    str_tmp = json_object_get_string(kjso);

    strlcpy(str_dst, str_tmp, size);

    return SUCCESS;
} 

const char *string_get_by_jso_key(const json_object *src_jso, const char *key)
{
    json_object *kjso = json_object_object_get(src_jso, key);
    if ((kjso == NULL) || (!json_object_is_type(kjso, json_type_string)))
    {
        return NULL;
    }

    return json_object_get_string(kjso);
}

int int_get_by_jso_key(const json_object *src_jso, const char *key)
{
    json_object *kjso = json_object_object_get(src_jso, key);
    if ((kjso == NULL) || (!json_object_is_type(kjso, json_type_int)))
    {
    	return FAILURE;
    }

    return json_object_get_int(kjso);
}


double double_get_by_jso_key(const json_object *src_jso, const char *key)
{
    json_object *kjso = json_object_object_get(src_jso, key);
    if ((kjso == NULL) || (!json_object_is_type(kjso, json_type_double)))
    {
    	return FAILURE;
    }

    return json_object_get_double(kjso);
}


json_bool bool_get_by_jso_key(const json_object *src_jso, const char *key)
{
    json_object *kjso = json_object_object_get(src_jso, key);
    if ((kjso == NULL) || (!json_object_is_type(kjso, json_type_boolean)))
    {
        return FAILURE;
    }

    return json_object_get_boolean(kjso);
}

 
/*
 * Appends src to string dst of size siz (unlike strncat, siz is the
 * full size of dst, not space left).  At most siz-1 charact
 * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
 * Returns strlen(src) + MIN(siz, strlen(initial dst)).
 * If retval >= siz, truncation occurred.
 */
size_t
strlcat(char *dst, const char *src, size_t siz)
{
    register char *d = dst;
    register const char *s = src;
    register size_t n = siz;
    size_t dlen;
 
    if (s == 0 || d == 0) return 0;
 
    /* Find the end of dst and adjust bytes left but don't go past end */
    while (n-- != 0 && *d != '\0')
        d++;
    dlen = d - dst;
    n = siz - dlen;
 
    if (n == 0)
        return(dlen + strlen(s));
    while (*s != '\0') {
        if (n != 1) {
            *d++ = *s;
            n--;
        }
        s++;
    }
    *d = '\0';
 
    return(dlen + (s - src));   /* count does not include NUL */
}


